#include <gtkmm.h>

class MyWindow : public Gtk::Window {
public:
    MyWindow() {
        set_title("GtkComboBox Example");  // 设置窗口标题
        set_default_size(300, 100);  // 设置窗口默认大小

        Gtk::Box* vbox = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_VERTICAL, 10));  // 创建垂直盒子容器
        add(*vbox);  // 将盒子容器添加到窗口

        // 创建列表存储对象
        list_store = Gtk::ListStore::create(columns);

        // 向列表存储中添加选项
        auto row = *(list_store->append());
        row[columns.m_col_text] = "Option 1";

        row = *(list_store->append());
        row[columns.m_col_text] = "Option 2";

        row = *(list_store->append());
        row[columns.m_col_text] = "Option 3";

        // 创建下拉列表控件并设置数据模型
        combo = Gtk::manage(new Gtk::ComboBox());
        combo->set_model(list_store);
        
        // 创建一个单元格渲染器
        auto renderer = Gtk::manage(new Gtk::CellRendererText());
        
        // 将渲染器添加到下拉列表中
        combo->pack_start(*renderer, true);
        combo->add_attribute(renderer->property_text(), columns.m_col_text);
        
        // 连接下拉列表选项改变事件的信号处理函数
        combo->signal_changed().connect(sigc::mem_fun(*this, &MyWindow::on_combo_changed));
        
        vbox->pack_start(*combo);  // 将下拉列表添加到盒子容器中

        label = Gtk::manage(new Gtk::Label("Select an option"));  // 创建标签控件
        vbox->pack_start(*label);  // 将标签添加到盒子容器中

        show_all_children();  // 显示所有子控件
    }

    virtual ~MyWindow() {}

protected:
    // 下拉列表选项改变事件处理函数
    void on_combo_changed() {
        int index = combo->get_active_row_number();  // 获取当前激活的选项索引
        if (index >= 0) {
            Gtk::TreeModel::iterator iter = combo->get_active();
            Glib::ustring text = (*iter)[columns.m_col_text];  // 获取选项文本
            label->set_text("Selected: " + text);  // 更新标签显示选中的选项
        }
    }

    // 列模型结构体
    class ModelColumns : public Gtk::TreeModel::ColumnRecord {
    public:
        ModelColumns() {
            add(m_col_text);  // 添加文本列
        }
        Gtk::TreeModelColumn<Glib::ustring> m_col_text;  // 文本列
    };

    ModelColumns columns;  // 列模型实例
    Glib::RefPtr<Gtk::ListStore> list_store;  // 列表存储对象
    Gtk::ComboBox* combo;  // 下拉列表控件指针
    Gtk::Label* label;  // 标签控件指针
};

int main(int argc, char *argv[]) {
    auto app = Gtk::Application::create(argc, argv, "com.example.GtkComboBoxExample");  // 创建 GTK 应用程序实例

    MyWindow window;  // 创建主窗口实例

    return app->run(window);  // 运行应用程序
}

